XML en .NET Core
Xml of Extensible Markup Language is een manier om data door te geven tussen computerprogrammas. Xml is een meta-taal. Dit is een taal die een andere taal omschrijft. Xml is een basis om afspraken te maken over de manier waarop men de data zal omschrijven en interpreteren. Met xml kan men nieuwe talen definiëren. XML zelf is al een eenvoudigere versie van SGML en ook platform onafhankelijk. Eenzelfde XML is dus bruikbaar op verschillende computers en besturingssystemen.
Een van de redenen waarom XML zo populair is , is omdat de basis heel gemakkelijk aan te leren is. Alleen is het zo dat men als gebruiker met alleen maar XML, niet veel kan doen. XML wordt normaal gezien gelezen en geschreven door computers.
Doestelling
Na deze les kan je XML manipuleren in C#.
Als voorbeeld nemen we de Postcodes. We lezen de postcodes in uit het csv bestand in een array en we serialiseren vervolgens de array als XML. Tenslotte lezen we het XML bestand in en zetten de XML om naar een List.
System.Xml.XmlSerrializer installeren
- MSDN documentatie
- Ik ga ervan uit dat je op je lokale computer een werkmap voor de module hebt gemaakt (in de trant van Programmeren5-15227 of Programmeren3-15268 of gewoon Programmeren3). Hangt ervan af in welke module dit toegepast wordt.
- Ik ga er ook vanuit dat je .NET Core reeds geactiveerd hebt. Indien niet ga je eerst naar Programmeren in Visual Studio.
- Daarnaast heb je reeds een project learning aangemaakt, indien niet ga je naar Oefening OO code schrijven. Daar zie je hoe je een learning project creëert.
- Het
System.Xml.XmlSerializer
pakket installeren. Hoe je dat doet vind je op de System.Xml.XmlSerializer pagina. We gaan de serializer installeren met behulp van NuGet.- De NuGet Package Manager Console openen:
- De serializer installeren met de instructie Install-Package System.Xml.XmlSerializer -Version 4.3.0:
- Volgens de documentatie kan je geen List of ArrayList serialiseren, alleen gewone arrays (zie XmlSerializer Class). Daarvoor voegen we de methode
GetArray
toe. Hoe je dit klassenbestand creëert leer je in CSV bestand deserialiseren naar een generieke lijst:public static Postcode[] GetPostcodeArray() { string[] lines = LeesUitCsvBestand().Split('\n'); Postcode[] postcodes = new Postcode[lines.Length]; int i = 0; foreach (string s in lines) { if (s.Length > 0) { postcodes[i++] = ToObject(s); } } return postcodes; }
- Voeg de methode
SerializeCsvToXml
toe aan de klasseTryOut
in de namespaceDotNetCore.Learning
in het klassenbestand met de naam Learning.cs.om een bestand te genereren met de postcodes in XML formaat:public static void SerializeCsvToXml() { XmlSerializer serializer = new XmlSerializer(typeof(Postcode[])); Postcode postcode = new Postcode(); TextWriter writer = new StreamWriter(@"Data/Postcode.xml"); //De serializer werkt niet voor een generieke lijst en ook niet voor ArrayList Postcode[] postcodes = GetPostcodeArray(); serializer.Serialize(writer, postcodes); writer.Close(); }
In de map Data staat nu een bestand met de naam Postcodes.xml:
- We maken nu een presentation methode om de postcodes in de console te tonen. Voeg de volgende methode toe aan de klasse
TryOut
in de namespaceDotNetCore.Learning
in het bestand met de naam Learning.cs:public static void ListPostcodes(List<Postcode> list) { foreach (Postcode postcode in list) { // One of the most versatile and useful additions to the C# language in version 6 // is the null conditional operator ?.Post Console.WriteLine("{0}\t{1}\t{2}\t{3}\t{4}", postcode?.Code, postcode?.Plaats, postcode?.Provincie, postcode?.Localite, postcode?.Province); } }
- En nu nog een methode om de postcodes om te zetten van XML formaat naar een
List
metPostcode
objecten. Voeg de methodeGetPostcodeListFromXml
toe aan de klasseTryOut
in de namespaceDotNetCore.Learning
in het klassenbestand met de naam Learning.cs:public static List<Postcode> GetPostcodeListFromXml() { XmlSerializer serializer = new XmlSerializer(typeof(Postcode[])); Postcode postcode = new Postcode(); StreamReader file = new System.IO.StreamReader(@"Data/Postcode.xml"); Postcode[] postcodes = (Postcode[])serializer.Deserialize(file); file.Close(); // array converteren naar List return new List<Postcode>(postcodes); }
- Probeer de methoden uit in de
Main
functie van Program.cs:using System; namespace DotNetCore.Learning { class Program { static void Main(string[] args) { TryOut.SerializeCsvToXml(); TryOut.ListPostcodes(TryOut.GetPostcodeListFromXml()); Console.ReadKey(); } } }
- En dat is het resultaat:
- Wijzigingen opslaan in de repo op Bitbucket
Er rest ons alleen nog de wijzigingen te sturen naar onze repo op Cloud9. Let erop dat ik in de voorbeelden een andere naam kan gebruiken. Ik gebruik dit lesmateriaal immers in meerdere modules.
Daarvoor voeren we de volgende stappen uit:
- ga naar het commando venster of naar PowerShell;
- ga naar de de map waar je project staat, we pushen immers het hele project en niet alleen de dotnetcore map (de naam van de map hangt af van de module die je aan het volgen bent):
cd "C:\Users\jefin\OneDrive\school 2017-2018\Programmeren3-15268"
- Voeg de volgende mappen en bestand toe in het .gitignore bestand:
- check de gewijzigde bestanden:
git status
- we merken dat er VS nieuwe bestanden heeft gemaakt die we niet in de repo willen, dus wijzigen we het .gitignore bestand;
dotnetcore/hwapp/bin/ dotnetcore/hwapp/obj/ dotnetcore/adodotnet/adodotnet/obj/ dotnetcore/adodotnet/adodotnet/bin/Debug/ dotnetcore/adodotnet/adodotnet/obj/Debug/ dotnetcore/adodotnet/adodotnet.sln dotnetcore/adodotnet/adodotnet/.vs/ dotnetcore/.vs/ dotnetcore/learning/bin/ dotnetcore/learning/obj/ dotnetcore/*.sln
- met
git
rm -rf --cached .
activeren we het nieuwe .gitignore bestand (VS verzameld automatisch bestanden) - opnieuw
git status
- verzamel de gewijzigde bestanden op de verzamelplaats:
git add --all
- check welke bestanden verzameld zijn:
git status
- leg ze neer en voeg er commentaar aan toe:
git commit -m "System.Xml.XmlSerrializer toegevoegd en uitgetest."
- verifiëer als je al een alias voor Bitbucket url hebt toegevoegd:
git remote -v
- Indien nodig voeg je een alias toe voor de Bitbucket url:
git remote add origin https://JefInghelbrecht@bitbucket.org/JefInghelbrecht/programmeren-3.git
- verstuur de neergelegde wijzigingen naar BitBucket:
git push -u origin master
- Als je repo's niet meer gesynchroniseerd zijn omdat dit de eerste keer is dag je dit doet, kan je de push forceren met de
-f
flag:
git
push -f origin master
. - check op Bitbucket als de repo bijgewerkt is